<?php
/**
 * Created by PhpStorm.
 * User: quyang
 * Date: 2017/2/21
 * Time: 16:29
 */
namespace Home\Server;
use Think\Server;
class ParcelNoticeResultServer {

    protected $current_table;  //當月表

    protected $Last_Month_Table;

    public function __construct()
    {

        $this->current_table = 'tp_parcel_notice_result_' . date('Ym');

        $this->Last_Month_Table = 'tp_parcel_notice_result_' . date( 'Ym',strtotime('-1 month') );

        $this->now_Time = time();

        //驗證當月表是否存在
        $this->queryCurrentTable();

    }

    /**
         * @desc  : 查詢隊列表是否存在對應數據
     * @author：quyang
     * @data : $parcelId
     * @time  ：2017/2/21 16:34
     * @update：2017/2/21
     **/
    public function queryParcelNotice( $parcelId ,$field = null )
    {

        $where = '`f_parcel_id` in ('.$parcelId.')';

        if (empty( $field )){
            $field = '*';
        }

        return $this->getConditionTable_Result( date( 'Y-m-01' , strtotime(  '-1 month' ) ) , date('Y-m-d') , $field , $where )->find();

    }

    /**
     * @desc  : 统计队列表数据
     * @author：quyang
     * @param ：
     * @time  ：2017/2/24 17:46
     * @update：2017/2/24
     **/
    public function countParcelNotice( $parcelId , $field = null )
    {

        $where = '`f_parcel_id` in ('.$parcelId.')';

        if (empty( $field )){
            $field = '*';
        }

        return $this->getConditionTable_Result( date( 'Y-m-01' , strtotime(  '-1 month' ) ) , date('Y-m-d') , $field , $where )->count();

    }

    /**
     * @desc  : 查詢隊列表是否存在對應數據（批量）
     * @author：quyang
     * @data : $parcelId
     * @time  ：2017/2/21 16:34
     * @update：2017/2/21
     **/
    public function sendParcelNotice( $parcelId , $stationId = '' , $startTime = null , $endTime = null )
    {

        $where = '`f_parcel_id` in ('.$parcelId.')';

        !empty($stationId) && $where .= ' AND `f_station_id` = '.$stationId.'';

        $startTime = empty($startTime) ? date( 'Y-m-01' , strtotime(  '-1 month' ) ) : $startTime;

        $endTime = empty($endTime) ? date('Y-m-d') : $endTime;

        return $this->getConditionTable_Result( $startTime , $endTime , '*' , $where )->select();

    }

    /**
     * @desc  : 查询队列表微信发送失败包裹
     * @author：quyang
     * @param ：
     * @time  ：2017/2/23 11:18
     * @update：2017/2/23
     **/
    public function queryWeixinSeng()
    {

        return $this ->getConditionTable_Result(
                            date( 'Y-m-01', strtotime('-1 month') ),
                            date( 'Y-m-d' ),
                            'f_parcel_id,f_take_code',
                            '`f_create_time_stamp` >='.( time()-(86400*2) ).' AND `f_weixin_notice` = 2 AND `f_sms_notice` = 0 AND `f_sms_num` = 0'
                            )
                        ->select()
                        ;
    }

    /**
     * @Desc  : 查询队列包裹状态
     * @Author：quyang
     * @Param ：
     * @Time  ：2017/5/10 18:24
     * @Update：2017/5/10
     **/
    public function queryParcelResult( $parcelId , $mobile )
    {

        $where = "`f_parcel_id` = '{$parcelId}' AND `f_recipient_mobile` = '{$mobile}'";

        return $this ->getConditionTable_Result(
                            date( 'Y-m-01', strtotime('-1 month') ),
                            date( 'Y-m-d' ),
                            'f_parcel_id,f_speed_status',
                            $where
                        )
                            ->select()
            ;

    }

    /**
     * @desc  : 发送微信
     * @author：quyang
     * @param ：
     * @time  ：2017/2/23 11:18
     * @update：2017/2/23
     **/
    public function sendWeixin()
    {
        //开始时间  结束时间  查询数据范围  查询条件
        return $this ->getConditionTable_Result(
                            date( 'Y-m-01', strtotime('-1 month') ),
                            date( 'Y-m-d' ),
                            '*',
                            '`f_create_time_stamp` >='.( time()-(86400*2) ).' AND `f_weixin_notice` = 0 AND `f_weixin_num` = 0'
                            )
                        ->select()
                        ;
    }

    /**
     * @desc  : 监控包裹数量统计
     * @author：quyang
     * @param ：
     * @time  ：2017/2/23 11:18
     * @update：2017/2/23
     **/
    public function countNum()
    {

         return ( new \Think\Model( $this->current_table ) )
//            ->buildSql();
            ->count('f_parcel_id');

    }

    /**
     * @desc  : 监控包裹状态统计
     * @author：quyang
     * @param ：
     * @time  ：2017/2/23 11:18
     * @update：2017/2/23
     **/
    public function sendSmsRecord()
    {

        return ( new \Think\Model( $this->current_table ) )
            ->field("
                f_parcel_id,
                f_weixin_notice,
                f_sms_notice,
                f_sms_error,
                f_mail_no,
                f_sms_send_time,
                f_sms_success_time
            ")
            ->page(1,10)
            ->order('f_sms_send_time_stamp desc')
//            ->buildSql();
            ->select();

    }

    /**
     * @Desc  : 查询微信发送状态为3并且微信发送时间超过30分钟的包裹
     * @Author：quyang
     * @Param ：
     * @Time  ：2017/3/31 14:01
     * @Update：2017/3/31
     **/
    public function queryWeinxinSendNotice()
    {

        $ordTime = time()-1800;

        //查询微信发送状态为3并且微信发送时间超过30分钟的包裹
        $where = "`f_create_time_stamp` >=".( time()-86400 )." AND `f_weixin_notice` = 3 AND `f_weixin_send_time_stamp`<{$ordTime}";

        //开始时间  结束时间  查询数据范围  查询条件
        return $this ->getConditionTable_Result(
                            date( 'Y-m-01', strtotime('-1 month') ),
                            date( 'Y-m-d' ),
                            '*',
                            $where
                        )
                        ->select();

    }

    /**
     * @desc  : 修改队列表包裹发送状态
     * @author：quyang
     * @param ：
     * @time  ：2017/3/31 10:26
     * @update：2017/3/31
     **/
    public function updateParcel( $parcelId , $Array ,$tableName = null )
    {

        $where = "`f_parcel_id` in ( {$parcelId} )";

        //表名字已知直接更改
        if ( !empty($tableName) ){
            return D($tableName)->where($where)->save($Array);
        }

        //分別查詢本月和上月的數據
        $table1 = D( $this->current_table )->where($where)->save( $Array );

        $table2 = D( $this->Last_Month_Table )-> where($where)->save( $Array );

        return $table1 || $table2 ? TRUE : FALSE;

    }

    /**
     * @desc  : 更新发送状态
     * @author：quyang
     * @param ：
     * @time  ：2017/2/23 13:05
     * @update：2017/2/23
     **/
    public function updateSendNotice( $parcelId , $content = null , $sendNotice = null , $returnNotice = null )
    {

        $content && $map['f_sms_content'] = $content;
        !empty($sendNotice) && $map['f_sms_notice'] = $sendNotice;
        if ( $returnNotice != null )
        {
            $map['f_sms_error'] = $returnNotice;
        }
        $map['f_sms_num'] = ['exp','f_sms_num+1'];
        $map['f_sms_send_time'] = date('YmdHis');
        $map['f_sms_send_time_stamp'] = time();

        $this->updateParcelNotice( $parcelId , $map );

    }

    /**
     * @desc  : 添加队列数据
     * @author：quyang
     * @param ：$Array:添加數據
     * @time  ：2017/2/21 17:52
     * @update：2017/2/21
     **/
    public function addParcelQueue( $Array )
    {

        //驗證當月表是否存在
//        if ( !$this->queryCurrentTable() ){
//            $this->insertTable();
//        }

        return ( new \Think\Model( $this->current_table ) )->add( $Array );

    }

    /**
     * @desc  : 添加队列数据批量
     * @author：quyang
     * @param ：$Array:添加數據
     * @time  ：2017/2/28 14:52
     * @update：2017/2/28
     **/
    public function addAllParcelQueue( $Array )
    {

        //驗證當月表是否存在
//        if ( !$this->queryCurrentTable() ){
//            $this->insertTable();
//        }

        return ( new \Think\Model( $this->current_table ) )->addAll( $Array );

    }

    /**
     * @desc  : 修改队列表包裹发送状态
     * @author：quyang
     * @param ：
     * @time  ：2017/2/23 10:26
     * @update：2017/2/23
     **/
    public function updateParcelNotice( $parcelId , $Array ,$tableName = null )
    {

        $parcelId = empty($parcelId) ? array(0) : $parcelId;

        $where['f_parcel_id'] = array( 'in', strval( $parcelId ) );

        //表名字已知直接更改
        if ( !empty($tableName) ){
            return D($tableName)->where($where)->save($Array);
        }

        //分別查詢本月和上月的數據
        $table1 = D( $this->current_table )->where($where)->save( $Array );

        $table2 = D( $this->Last_Month_Table )-> where($where)->save( $Array );

        return $table1 || $table2 ? TRUE : FALSE;

    }

    /**
     * @desc  : 查詢當月表是否存在
     * @author：quyang
     * @param ：
     * @time  ：2017/2/21 17:30
     * @update：2017/2/21
     **/
    public function queryCurrentTable(  )
    {

        $table = ( new \Think\Model() )->query( "SHOW TABLES LIKE '{$this->current_table}'" ) ;

        //表不存在則創建
        if ( !$table ){

            $this->insertTable();

        }

        return true;

    }

    /**
     * Function getConditionTable_Result
     * @param $startDate
     * @param $endDate
     * @param $fields
     * @param $where
     * @return \Think\Model
     *
     * Author: 黄盖
     * Date: 2017-2-7 16:43
     * Info: 获取查询连表数据
     */
    public function getConditionTable_Result( $startDate, $endDate, $fields,  $where )
    {
        $tableName_Array = $NO_ExistsDate = Array();

        //查询哪些表
        if( ! empty( $startDate ) && ! empty( $endDate ) )
        {
            //2017-01-30   2017-03-01
            $startDateInfo = explode('-', $startDate);
            $endDateInfo   = explode('-', $endDate);

            //获取区间日期有哪些年月
            $MonthData = $this ->getYearMonth( $startDateInfo[0], $startDateInfo[1], $endDateInfo[0], $endDateInfo[1] );

            //获取存在哪些表
            $TableExists = ( new \Think\Model() ) ->query( "SHOW TABLES LIKE 'tp_parcel_notice_result_%';" );
            $ExistsName = Array();

            //提取分表名
            foreach( $TableExists as $TKey => $TVal )
            {
                sort($TVal);
                $ExistsName[] = $TVal[0];
            }

            foreach( $MonthData as $MKey => $MVal )
            {
                if( in_array( 'tp_parcel_notice_result_' . $MVal, $ExistsName ) )
                {
                    $tableName_Array[] = 'tp_parcel_notice_result_' . $MVal;
                }
                else
                {
                    $NO_ExistsDate[] = $MVal;
                }
            }
        }
        //默认两个月
        else
        {
            $tableName_Array[] = $this ->current_table;
            $tableName_Array[] = $this ->Last_Month_Table;
        }

        $UNION_Tables = '(';

        //交联主表
        if( ! empty( $NO_ExistsDate ) )
        {
            $UNION_Tables .= "
                            (
                                SELECT 
                                    {$fields}, 'tp_parcel_notice_result' AS `table_name`
                                FROM
                                    `tp_parcel_notice_result`
                                WHERE
                                    {$where} AND `f_create_time_stamp` BETWEEN '". strtotime( $startDate . ' 00:00:00' ) ."' AND '". ( count( $tableName_Array ) > 0 ? strtotime('+1 month', strtotime( substr( $NO_ExistsDate[count( $NO_ExistsDate ) - 1], 0, 4 ) . '-' . substr( $NO_ExistsDate[count( $NO_ExistsDate ) - 1], 4, 2 ) . '-01 00:00:00' )) : strtotime( $endDate . ' 23:59:59' ) ) ."'
                            )
                        ";

            $UNION_Tables .= 'UNION';
        }

        //交联分表
        foreach( $tableName_Array as $TKey => $TVal )
        {
            $TimeWhere = '';

            //查询结束时间节点
            if( count( $tableName_Array ) - 1 == $TKey )
            {
                $TimeWhere .= ' AND `f_create_time_stamp` <= ' . strtotime( $endDate . ' 23:59:59' );
            }

            //查询开始时间节点
            if( empty( $NO_ExistsDate ) && $TKey == 0 )
            {
                $TimeWhere .= ' AND `f_create_time_stamp` >= ' . strtotime( $startDate . ' 00:00:00' );
            }


            $UNION_Tables .= "
                            (
                                SELECT 
                                    {$fields}, '{$TVal}' AS `table_name`
                                FROM
                                    `{$TVal}`
                                WHERE
                                    {$where} {$TimeWhere}
                            )
                        ";

            $UNION_Tables .= 'UNION';
        }

        $UNION_Tables = substr( $UNION_Tables, 0, -5 );

        $UNION_Tables .= ') AS `temp_parcel_notice_result`';

        //返回连表资源
        return ( new \Think\Model() )
            ->field('*')
            ->table( $UNION_Tables );
    }

    /**
     * Function getYearMonth
     * @param $startYear
     * @param $startMonth
     * @param $endYear
     * @param $endMonth
     * @return array
     *
     * Author: 黄盖
     * Date: 2017-2-7 16:43
     * Info: 根据日期区间, 获取中间的年月
     */
    public function getYearMonth( $startYear, $startMonth, $endYear, $endMonth )
    {
        $MonthData = Array();
        $startMonth = intval( $startMonth );
        $endMonth = intval( $endMonth );

        for( $i = 0; $i <= $endYear - $startYear; $i++ )
        {
            $Now_Year = $startYear + $i;

            if( $Now_Year == $startYear && $Now_Year == $endYear )
            {
                for( $s = $startMonth; $s <= $endMonth; $s ++ )
                {
                    $MonthData[] = $Now_Year . ( $s < 10 ? '0' . $s : $s );
                }
            }
            else if( $Now_Year == $startYear )
            {
                for( $s = $startMonth; $s <= 12; $s ++ )
                {
                    $MonthData[] = $Now_Year . ( $s < 10 ? '0' . $s : $s );
                }
            }
            else if( $Now_Year == $endYear )
            {
                for( $s = 1; $s <= $endMonth; $s ++ )
                {
                    $MonthData[] = $Now_Year . ( $s < 10 ? '0' . $s : $s );
                }
            }
            else
            {
                for( $s = 1; $s <= 12; $s ++ )
                {
                    $MonthData[] = $Now_Year . ( $s < 10 ? '0' . $s : $s );
                }
            }

        }

        sort( $MonthData );

        return $MonthData;
    }


    /**
     * Function getConditionStorage
     * @param $station_id               站点ID
     * @param string $mobile            收件人手机号码
     * @param $date                     查询月份 (废弃)
     * @param int $parcel_status        包裹状态
     * @param int $page                 当前第几页
     * @param int $size                 每页多少条
     *
     * @param int $expcomID             快递公司ID
     * @param string $mailNO            运单号
     * @param string $recipient_name    收件人
     * @param int $startDate            查询起始日期
     * @param int $endDate              查询结束日期
     * @param int $takeCode             提货码
     * @return mixed
     *
     * @return mixed
     *
     * Author: 黄盖
     * Date: 2017-1-19 17:17
     * Info: 多状态查询
     */
    public function getConditionStorage( $station_id , $mobile = '', $date = '', $parcel_status = 0, $page = 0, $size = 10
        , $expcomID = 0, $num = '' ,  $recipient_name = '', $startDate = 0, $endDate = 0, $sendNotice = 0 ,$expcomName = ''
    )
    {

        //通用条件
        $ConditionSQL = $this ->getConditionSQL( $station_id, $mobile , $expcomID, $num ,  $recipient_name , $sendNotice ,$expcomName );

        //API版 date数据有用。 未传  $startDate $endDate。 数据转换
        if( $startDate == 0 || $endDate == 0 )
        {
            //开始日期
            $startDate = substr( $date, 0, 4 ) . '-' . substr( $date, 4, 2 ) . '-01';

            //结束日期
            $endDate = date('Y-m-d', strtotime( '+1 month', strtotime( $startDate . ' 00:00:00' ) ) - 1 );
        }

        $parcelNotice = $this->getConditionTable_Result( $startDate, $endDate, '`f_parcel_id`,f_weixin_notice AS fWeixinStatus, f_sms_notice AS fSmsStatus,f_sms_content as fSmsContent', $ConditionSQL )->select();

        //队列分表查询慢  改用in查询包裹信息
        foreach ( $parcelNotice as $v ){
            $parcelId[] = $v['f_parcel_id'];
        }

        $parcelId = implode( ',' , $parcelId );

        $Notice = new \Home\Server\SpeedParcelService();

        $parcelId = empty($parcelId) ? 0 : $parcelId;

        $where = $this->getParcelStatusSql( $parcelId , $parcel_status );

        $Data = $Notice ->getConditionTable_Result( $startDate, $endDate, '
                                                                            f_company_id AS fCompanyId,
                                                                            f_company_name AS fCompanyName,
                                                                            f_input_source AS fInputSource,
                                                                            
                                                                            f_arrive_timestamp AS fArriveTimestamp,
                                                                            FROM_UNIXTIME( `f_arrive_timestamp`, \'%m-%d\') AS fArriveTimeDate,
                                                                            
                                                                            `f_last_timestamp` AS fLastTimestamp,
                                                                            FROM_UNIXTIME( `f_last_timestamp`, \'%m-%d\') AS fLastTimeDate,
                                                                            

                                                                            f_num AS fNum,
                                                                            f_parcel_id AS fParcelId,
                                                                            f_parcel_status AS fParcelStatus,
                                                                            f_recipient_mobile AS fRecipientMobile,
                                                                            f_recipient_name AS fRecipientName,
                                                                            f_station_id AS fStationId,
                                                                            f_frame_code AS fFrameCode,
                                                                            f_comment AS fComment
                                                                        ', $where )

            ->field('
                        `temp_parcel_info`.*,
                        `tp_user`.`f_station_name` AS `stationName`
                    ')

            //获取站点名, 连表字段需 f_user_id
            ->join('LEFT JOIN `tp_user` ON `temp_parcel_info`.`fStationId` = `tp_user`.`f_user_id`')
//            ->order( $this ->getConditionStatus_Order( $parcel_status ) )
            ->order( '`fArriveTimestamp` DESC' )
            ->page( $page, $size )
//            ->buildSql()
            ->select()
        ;

        //循环写入包裹发送状态
        foreach ( $Data as $k2=>$v2 ){
            foreach ( $parcelNotice as $value ){
                if ( $v2['fParcelId'] == $value['f_parcel_id'] ){
                    $Data[$k2]['fWeixinStatus'] = $value['fWeixinStatus'];
                    $Data[$k2]['fSmsStatus'] = $value['fSmsStatus'];
                    $Data[$k2]['fSmsContent'] = $value['fSmsContent'];
                }
            }
        }

        return $Data;
    }

    /**
     * Function countConditionStorage
     * @param $station_id
     * @param string $mobile
     * @param $date
     * @param int $parcel_status
     * @return mixed
     *
     * Author: 黄盖
     * Date: 2017-1-19 17:43
     * Info: 多状态查询 统计
     */
    public function countConditionStorage( $station_id, $mobile = '', $date, $parcel_status = 0
        , $expcomID = 0, $num = '' , $recipient_name = '', $startDate = 0, $endDate = 0 , $sendNotice = 0 ,$expcomName = ''
    )
    {
        //通用条件
        $ConditionSQL = $this ->getConditionSQL( $station_id, $mobile, $expcomID , $num , $recipient_name , $sendNotice ,$expcomName );

        //API版 date数据有用。 未传  $startDate $endDate。 数据转换
        if( $startDate == 0 || $endDate == 0 )
        {
            //开始日期
            $startDate = substr( $date, 0, 4 ) . '-' . substr( $date, 4, 2 ) . '-01';

            //结束日期
            $endDate = date('Y-m-d', strtotime( '+1 month', strtotime( $startDate . ' 00:00:00' ) ) - 1 );
        }

        //判断不限制包裹状态查询所有包裹数据
        if ( $parcel_status == -1 )
        {
            return $this ->getConditionTable_Result( $startDate, $endDate, 'f_parcel_id', $ConditionSQL )
                ->count("f_parcel_id")
                ;
        }
        else
        {

            //查询其他符合条件的数据
            $parcelIds = $this ->getConditionTable_Result( $startDate, $endDate, 'f_parcel_id', $ConditionSQL )->select();

            if ( is_array( $parcelIds ) && count( $parcelIds ) > 0 )
            {
                $parcel_id = '';

                foreach ( $parcelIds as $value )
                {
                    $parcel_id .= $value['f_parcel_id'].',';
                }

                $parcel_id = rtrim( $parcel_id , ',' );

                $where = $this->getParcelStatusSql( $parcel_id , $parcel_status );

                $Notice = new \Home\Server\SpeedParcelService();

                //统计数量
                return $Notice->getConditionTable_Result( $startDate , $endDate , 'f_parcel_id' , $where )->count( 'f_parcel_id' );
            }

            return '0';

        }

    }

    /**
     * Function getConditionSQL
     * @param $station_id
     * @param string $mobile
     * @param $date
     * @param int $parcel_status    0 按照入库时间倒序  1按照提货时间倒序  其他 按照更新时间倒序
     *                  -1  查询所有条件
     *                  -250 查询已到站中的全部 ( 0 2 5 )
     * @return array
     *
     *
     *
     * Author: 黄盖
     * Date: 2017-1-19 17:43
     * Info: 多创建查询的SQL公用方法
     */
    public function getConditionSQL( $station_id, $mobile = '' , $expcomID = 0, $num = '' , $recipient_name = '' , $sendNotice = 0 ,$expcomName = '' )
    {
        $selectSQL = "`f_station_id` IN ( {$station_id} ) AND `f_speed_status` = 2";

        if( $expcomID > 0 )
        {
            $selectSQL .= " AND `f_company_id` = '{$expcomID}'";
        }

        if ($expcomName != '')
        {
            $selectSQL .= " AND `f_company_name` = '{$expcomName}'";
        }

        if( $mobile != '' )
        {
            $selectSQL .= " AND `f_recipient_mobile` = '{$mobile}'";
        }

        if( $recipient_name != '' )
        {
            $selectSQL .= " AND `f_recipient_name` = '{$recipient_name}'";
        }

        if ( $num != '' )
        {
            $selectSQL .= " AND `f_num` = '{$num}'";
        }

        //发送状态为1时查找发送成功的数据
        if ( $sendNotice == 1 )
        {
            $selectSQL .= " AND (`f_weixin_notice` = 1 OR `f_sms_notice` = 1)";
        }
        //发送状态为2时查找草稿箱中的数据
        elseif ( $sendNotice == 2 )
        {
            $selectSQL .= " AND `f_weixin_notice` != 1 AND `f_sms_notice` != 1";
        }

        return $selectSQL;
    }

    /**
     * @Desc  : 极速版查询包裹状态
     * @Author：quyang
     * @Param ：
     * @Time  ：2017/5/18 15:39
     * @Update：2017/5/18
     **/
    public function getParcelStatusSql( $parcelId , $parcel_status = 0 )
    {

        $selectSQL = "`f_parcel_id` in ({$parcelId})";

        //查包裹状态  已到站 中 的全部
        if( $parcel_status != -1 )
        {
            $selectSQL .= " AND `f_parcel_status` = '{$parcel_status}'";
        }
        else
        {

        }

        return $selectSQL;

    }

    /**
     * Function getConditionStatus_Order
     * @param int $parcel_status
     *
     * Author: 黄盖
     * Date: 2017-2-8 10:53
     * Info: 查询条件 根据 $parcel_status 查排序方式
     *                      0 按照入库时间倒序  1按照提货时间倒序  其他 按照更新时间倒序
     */
    public function getConditionStatus_Order( $parcel_status = 0 )
    {
        if( $parcel_status == 0 )
        {
            return '`fArriveTimestamp` DESC';
        }
        else
        {
            return '`fLastTimestamp` DESC';
        }
    }


    /**
     * @desc  : 自動創建當月表
     * @author：quyang
     * @param ：
     * @time  ：2017/2/21 17:41
     * @update：2017/2/21
     **/
    public function insertTable()
    {

        ( new \Think\Model() )->execute("
                CREATE TABLE `{$this->current_table}` (
                `f_parcel_id` int(10) NOT NULL COMMENT '包裹Id',
                `f_take_code` int(11) NOT NULL COMMENT '提货码',
                `f_weixin_notice` tinyint(2) NOT NULL DEFAULT '0' COMMENT '微信状态0：未通知1： 成功2：失败 3.已发送',
                `f_weixin_num` tinyint(2) NOT NULL DEFAULT '0' COMMENT '微信发送数量',
                `f_weixin_success_time` varchar(20) DEFAULT NULL COMMENT '微信发送成功时间',
                `f_weixin_success_time_stamp` int(11) DEFAULT NULL COMMENT '微信发送时间戳',
                `f_sms_notice` tinyint(2) NOT NULL DEFAULT '0' COMMENT '短信状况0.未发送1.发送成功2.发送失败3.已发送',
                `f_sms_num` tinyint(4) NOT NULL DEFAULT '0' COMMENT '短信发送数量',
                `f_sms_success_time` varchar(20) DEFAULT NULL COMMENT '短信成功时间',
                `f_sms_success_time_stamp` int(11) DEFAULT NULL COMMENT '短信发送成功时间戳',
                `f_recipient_mobile` varchar(15) NOT NULL COMMENT '收件人手机号',
                `f_recipient_name` varchar(255) DEFAULT NULL COMMENT '收件人姓名',
                `f_mail_no` varchar(50) NOT NULL COMMENT '运单号',
                `f_company_name` varchar(255) NOT NULL COMMENT '快递公司名称',
                `f_address` varchar(255) NOT NULL COMMENT '站点地址',
                `f_qtime` varchar(50) NOT NULL COMMENT '站点营业时间',
                `f_tel` varchar(20) DEFAULT NULL COMMENT '站点电话',
                `f_sms_content` text COMMENT '短信内容',
                `f_weixin_send_time` varchar(20) DEFAULT '' COMMENT '微信发送时间',
                `f_weixin_send_time_stamp` int(11) DEFAULT NULL COMMENT '微信发送时间戳',
                `f_sms_send_time` varchar(20) DEFAULT NULL COMMENT '短信发送时间',
                `f_sms_send_time_stamp` int(11) DEFAULT NULL COMMENT '短信发送时间戳',
                `f_station_id` int(11) NOT NULL COMMENT '站点id',
                `f_station_name` varchar(255) NOT NULL COMMENT '站点名称',
                `f_sms_error` varchar(20) DEFAULT NULL COMMENT '失败错误码A.端口关闭B.余额不足C.提交失败D.模板获取失败E.替换内容失败0.提交成功',
                `f_create_time` varchar(20) NOT NULL COMMENT '创建时间',
                `f_create_time_stamp` int(11) DEFAULT NULL COMMENT '创建时间戳',
                `f_speed_status` tinyint(2) DEFAULT '0' COMMENT '入库来源  0.普通版 1.专业版 2.极速版',
                `f_num` varchar(65) DEFAULT '0' COMMENT '包裹编号',
                PRIMARY KEY (`f_parcel_id`),
                KEY `f_mail_no` (`f_mail_no`),
                KEY `f_weixin_notice` (`f_weixin_notice`) USING BTREE,
                KEY `f_sms_notice` (`f_sms_notice`) USING BTREE,
                KEY `f_take_code` (`f_take_code`) USING BTREE,
                KEY `f_recipient_mobile` (`f_recipient_mobile`) USING BTREE,
                KEY `f_num` (`f_num`),
                KEY `f_speed_status` (`f_speed_status`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
        ");

    }

}